#!/usr/perl5/bin/perl
#
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
# Common Development and Distribution License (the "License").
# You may not use this file except in compliance with the License.
#
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
# or http://www.opensolaris.org/os/licensing.
# See the License for the specific language governing permissions
# and limitations under the License.
#
# When distributing Covered Code, include this CDDL HEADER in each
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
# If applicable, add the following below this CDDL HEADER, with the
# fields enclosed by brackets "[]" replaced with your own identifying
# information: Portions Copyright [yyyy] [name of copyright owner]
#
# CDDL HEADER END
#
# Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
#
# sunw-history-package
#  A simple program to generate the actions contained in the SUNW package
#  that maps between the old (pre build-133) and new ips package names.
#

$|=1;

use Getopt::Long;
use File::Basename /qw basename/;

my $PKG = '/usr/bin/pkg';

sub generate_manifest {
	local ($package_name) = @_;
	my ($package, %depends) = ();

	# gather some data
	open($FP, "$PKG contents -r -H -o action.raw $package_name |");

	while (<$FP>) {	# save what we want
		if (m{set\s+name=pkg.fmri\s+value=pkg://.+/(.+):.+$}) {
			$package = $1;
		} elsif (m{depend fmri=(.+)\s+type=require$}) {
			$depends{$1} = 1;
		}
	}

	close($FP);

	# generate the manifest actions
	print <<EOF;
set name=pkg.fmri value=pkg:/$package
set name=pkg.renamed value=true

set name=org.opensolaris.consolidation value=\$(CONSOLIDATION)

set name=variant.opensolaris.zone value=global value=nonglobal
set name=variant.arch value=\$(ARCH)

EOF
	foreach (sort keys %depends) {
		(m{^consolidation/}) ||
			print "depend fmri=$_ type=require\n"
	}
}

sub usage {
	my $program = basename($0);
	print <<EOF;
Usage: $program (--package (new-ips-name)) ...

EOF
	exit(1);
}

sub main {
	my (@current_packages, %SUNWpackages) = ();

	GetOptions('package:s' => \@current_packages);

	($#current_packages == -1) && usage();

	# find all SUNW packages that require the supplied packages
	foreach (@current_packages) {
		open($FP, "$PKG search -r -H -o pkg.name 'SUNW*:depend::*/$_' |");
	
		while (<$FP>) {
			chomp;
			$SUNWpackages{$_} = 1;
		}
	
		close($FP);
	}

	# generate manifests for each SUNWpackage
	foreach (sort keys %SUNWpackages) {
		print "\n\n$_.p5m actions:\n";
		generate_manifest($_);
	}
}

#
# Main execution starts here.
#
main();
